// Работа с буфером обмена из 1С
//
// Copyright 2020 ООО "Центр прикладных разработок"
//
//   Licensed under the Apache License, Version 2.0 (the "License");
//   you may not use this file except in compliance with the License.
//   You may obtain a copy of the License at
//
//       http://www.apache.org/licenses/LICENSE-2.0
//
//   Unless required by applicable law or agreed to in writing, software
//   distributed under the License is distributed on an "AS IS" BASIS,
//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//   See the License for the specific language governing permissions and
//   limitations under the License.
//
//
// URL:    https://github.com/cpr1c/clipboard_1c
// Требования: платформа 1С версии 8.3.14 и выше
// С более ранними платформами могут быть проблемы с подключением компоненты, а также с работой некоторых методов

#Область ПрограммныйИнтерфейс

// Возвращает текущую версию подсистемы
// 
// Возвращаемое значение:
// 	Строка - Версия подсистемы работы с буфером обмена
Функция ВерсияПодсистемы() Экспорт
	Возврат "1.0.2";
КонецФункции

// Возвращает объект компоненты работы с буфером обмена. Компонента должна быть предвариательно подключена.
// При неподключенной компоненте вызовется исключение
// 
// Возвращаемое значение:
// 	ВнешняяКомпонентаОбъект - Объект внешней компоненты работы с буфером обмена. 
Функция ОбъектКомпоненты() Экспорт
	Возврат Новый ("AddIn." + ИдентификаторКомпоненты() + ".ClipboardControl");
КонецФункции

#Область СинхронныеМетоды

// Используются синхронные вызовы
// Возвращает объект компоненты работы с буфером обмена. При необходимости происходит подключение и установка компоненты
// 
// Возвращаемое значение:
// 	ВнешняяКомпонентаОбъект - Объект внешней компоненты работы с буфером обмена 
//  Неопределено - если не удалось подключить компоненту
Функция КомпонентаРаботыСБуферомОбмена() Экспорт
	Попытка
		Компонента= ПроинициализироватьКомпоненту(Истина);

		Возврат Компонента;
	Исключение
		ТекстОшибки = НСтр(
			"ru = 'Не удалось подключить внешнюю компоненту для работы с буфером обмена. Подробности в журнале регистрации.'");
		Сообщить(ТекстОшибки + ОписаниеОшибки());
		Возврат Неопределено;
	КонецПопытки;
КонецФункции

// Возвращает версию компоненты работы с буфером обмена
// 
// Параметры:
// 	ОбъектКомпоненты - ВнешняяКомпонентаОбъект - Объект внешней компоненты работы с буфером обмена (Необязательный)
// Возвращаемое значение:
// 	Строка - Версия используемой компоненты 
Функция ВерсияКомпоненты(ОбъектКомпоненты = Неопределено) Экспорт
	ОчищатьКомпоненту=ОбъектКомпоненты = Неопределено;

	ОбъектКомпоненты=ОбъектКомпонентыРаботыСБуферомОбмена(ОбъектКомпоненты);

	Версия=ОбъектКомпоненты.Версия;

	Если ОчищатьКомпоненту Тогда
		ОбъектКомпоненты=Неопределено;
	КонецЕсли;

	Возврат Версия;
КонецФункции

// Очищает содержимое буфера обмена
// 
// Параметры:
// 	ОбъектКомпоненты - ВнешняяКомпонентаОбъект - Объект внешней компоненты работы с буфером обмена (Необязательный)
Процедура ОчиститьБуферОбмена(ОбъектКомпоненты = Неопределено) Экспорт
	ОчищатьКомпоненту=ОбъектКомпоненты = Неопределено;

	ОбъектКомпоненты=ОбъектКомпонентыРаботыСБуферомОбмена(ОбъектКомпоненты);
	ОбъектКомпоненты.Очистить();

	Если ОчищатьКомпоненту Тогда
		ОбъектКомпоненты=Неопределено;
	КонецЕсли;

КонецПроцедуры

// Помещает переданную картинку в буфер обмена
// 
// Параметры:
// 	Картинка- Картинка, ДвоичныеДанные , АдресВоВременномХранилище
// 	Если передается как адресВоВременномХранилище тип во временном хоранилище должен быть или картинка или двоичные данные
// 	ОбъектКомпоненты - ВнешняяКомпонентаОбъект - Объект компоненты работы с буфером обмена (Необязательный)
Процедура КопироватьКартинкуВБуфер(Картинка, ОбъектКомпоненты = Неопределено) Экспорт
	ОчищатьКомпоненту=ОбъектКомпоненты = Неопределено;

	ТекКартинка=КартинкаДляКопированияВБуфер(Картинка);
	Если ТекКартинка = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ОбъектКомпоненты=ОбъектКомпонентыРаботыСБуферомОбмена(ОбъектКомпоненты);
	ОбъектКомпоненты.ЗаписатьКартинку(ТекКартинка);

	Если ОчищатьКомпоненту Тогда
		ОбъектКомпоненты=Неопределено;
	КонецЕсли;

КонецПроцедуры

// получает картинку из буфера обмена в формате PNG
// 
// Параметры:
// 	ВариантПолучения - Строка
// 	Один из варинатов:
// 		ДвоичныеДанные- получение двоичных данных картинки
// 		Картинка- Преобразованное к типу "Картинка" содержание буфера
// 		Адрес- Адрес двоичных данных картинки во временном хранилище
// 	ОбъектКомпоненты - ВнешняяКомпонентаОбъект -  Объект компоненты работы с буфером обмена (Необязательный)
// Возвращаемое значение:
// 	ДвоичныеДанные,Картинка,Строка - картинка в запрощенном формате
//	Неопределено- если в буфере нет картинки
Функция КартинкаИзБуфера(ВариантПолучения = "Картинка", ОбъектКомпоненты = Неопределено) Экспорт
	ОчищатьКомпоненту=ОбъектКомпоненты = Неопределено;

	ОбъектКомпоненты=ОбъектКомпонентыРаботыСБуферомОбмена(ОбъектКомпоненты);
	ДанныеКартинкиВБуфере=ОбъектКомпоненты.Картинка;

	Если ОчищатьКомпоненту Тогда
		ОбъектКомпоненты=Неопределено;
	КонецЕсли;

	Возврат КартинкаВНужномФорматеИзБуфера(ДанныеКартинкиВБуфере, ВариантПолучения);
КонецФункции

// Помещает переданную строку в буфер обмена
// 
// Параметры:
// 	СтрокаКопирования- Строка- Строка, которую необходимо поместить в буфер обмена
// 	ОбъектКомпоненты - ВнешняяКомпонентаОбъект - Объект компоненты работы с буфером обмена (Необязательный)
Процедура КопироватьСтрокуВБуфер(СтрокаКопирования, ОбъектКомпоненты = Неопределено) Экспорт
	ОчищатьКомпоненту=ОбъектКомпоненты = Неопределено;

	ОбъектКомпоненты=ОбъектКомпонентыРаботыСБуферомОбмена(ОбъектКомпоненты);
	ОбъектКомпоненты.ЗаписатьТекст(СтрокаКопирования);

	Если ОчищатьКомпоненту Тогда
		ОбъектКомпоненты=Неопределено;
	КонецЕсли;

КонецПроцедуры

// получает текущую строку из буфера обмена 
// 
// Параметры:
// 	ОбъектКомпоненты - ВнешняяКомпонентаОбъект - Объект компоненты работы с буфером обмена (Необязательный)
// Возвращаемое значение:
// 	Строка - Текст, содержащийся в буфере обмена
Функция ТекстИзБуфера(ОбъектКомпоненты = Неопределено) Экспорт
	ОчищатьКомпоненту=ОбъектКомпоненты = Неопределено;

	ОбъектКомпоненты=ОбъектКомпонентыРаботыСБуферомОбмена(ОбъектКомпоненты);

	ТекстБуфера=ОбъектКомпоненты.Текст;

	Если ОчищатьКомпоненту Тогда
		ОбъектКомпоненты=Неопределено;
	КонецЕсли;

	Возврат ТекстБуфера;

КонецФункции

// получает формат текущего значения из буфера обмена 
// 
// Параметры:
// 	ОбъектКомпоненты - ВнешняяКомпонентаОбъект - Объект компоненты работы с буфером обмена (Необязательный)
// Возвращаемое значение:
// 	Строка - Строка в формате JSON, содержащая описание формата содержимого буфера обмена
Функция ФорматБуфераОбмена(ОбъектКомпоненты = Неопределено) Экспорт
	ОчищатьКомпоненту=ОбъектКомпоненты = Неопределено;

	ОбъектКомпоненты=ОбъектКомпонентыРаботыСБуферомОбмена(ОбъектКомпоненты);

	ФорматБуфера=ОбъектКомпоненты.Формат;

	Если ОчищатьКомпоненту Тогда
		ОбъектКомпоненты=Неопределено;
	КонецЕсли;

	Возврат ФорматБуфера;
КонецФункции

#КонецОбласти

#Область АсинхронныеМетоды

// Начинает получение объекта внешней компоненты работы с буфером обмена. При необходимости будет произведено подключение и установка компоненты
// 
// Параметры:
// 	ОписаниеОповещения - ОписаниеОповещения - Содержит описание процедуры, которая будет вызвана после завершения со следующими параметрами:
//<ОбъектКомпоненты> – Объект компоненты работы с буфером обмена, Тип: ВнешняяКомпонентаОбъект. Неопределено- если не удалось подключить компоненту
//<ДополнительныеПараметры> - значение, которое было указано при создании объекта ОписаниеОповещения.
Процедура НачатьПолучениеКомпоненты(ОписаниеОповещения) Экспорт
	НачатьИнициализациюКомпоненты(ОписаниеОповещения, Истина);
КонецПроцедуры

// Начинает получение версии используемой компоненты работы с буфером обмена
// 
// Параметры:
// 	ОписаниеОповещения - ОписаниеОповещения - Содержит описание процедуры, которая будет вызвана после завершения со следующими параметрами:
//	<ВерсияКомпоненты> – Версия используемой компоненты, Тип: Строка. Неопределено- если не удалось подключить компоненту
//	<ДополнительныеПараметры> - значение, которое было указано при создании объекта ОписаниеОповещения.
// 	ОбъектКомпоненты - ВнешняяКомпонентаОбъект - Объект компоненты работы с буфером обмена (Необязательный)
Процедура НачатьПолучениеВерсииКомпоненты(ОписаниеОповещения, ОбъектКомпоненты = Неопределено) Экспорт
	Если ОбъектКомпоненты = Неопределено Тогда
		ДопПараметры=Новый Структура;
		ДопПараметры.Вставить("ОписаниеОповещенияОЗавершении", ОписаниеОповещения);

		НачатьПолучениеКомпоненты(
			Новый ОписаниеОповещения("НачатьПолучениеВерсииКомпонентыЗавершениеПолученияКомпоненты", ЭтотОбъект,
			ДопПараметры));
	Иначе
		ОбъектКомпоненты.НачатьПолучениеВерсия(ОписаниеОповещения);
	КонецЕсли;
КонецПроцедуры

// Начинает очистку содержимого буфера обмена
// 
// Параметры:
// 	ОписаниеОповещения - ОписаниеОповещения - Содержит описание процедуры, которая будет вызвана после завершения со следующими параметрами:
//	<РезультатОчистки> – Результат очистки, Тип: Булево. Неопределено- если не удалось подключить компоненту
//	<ПараметрыВызова> - Пустой массив
//	<ДополнительныеПараметры> - значение, которое было указано при создании объекта ОписаниеОповещения.
// 	ОбъектКомпоненты - ВнешняяКомпонентаОбъект - Объект компоненты работы с буфером обмена (Необязательный)
Процедура НачатьОчисткуБуфераОбмена(ОписаниеОповещения, ОбъектКомпоненты = Неопределено) Экспорт
	ДопПараметры=Новый Структура;
	ДопПараметры.Вставить("ОписаниеОповещенияОЗавершении", ОписаниеОповещения);
	Если ОбъектКомпоненты = Неопределено Тогда
		НачатьПолучениеКомпоненты(Новый ОписаниеОповещения("НачатьОчисткуБуфераОбменаЗавершениеПолученияКомпоненты",
			ЭтотОбъект, ДопПараметры));
	Иначе
		ОбъектКомпоненты.НачатьВызовОчистить(
			Новый ОписаниеОповещения("НачатьОчисткуБуфераОбменаЗавершениеВызоваМетодаКомпонента", ЭтотОбъект,
			ДопПараметры));
	КонецЕсли;
КонецПроцедуры

// Начинает помещение картинку в буфер обмена
// 
// Параметры:
// 	Картинка
// 	ОписаниеОповещения - ОписаниеОповещения - Содержит описание процедуры, которая будет вызвана после завершения со следующими параметрами:
//	<Результат> – Результат установки картинки в буфере обмена, Тип: Булево. Неопределено- если не удалось подключить компоненту
//	<ПараметрыВызова> - Массив параметров вызова метода компоненты
//	<ДополнительныеПараметры> - значение, которое было указано при создании объекта ОписаниеОповещения.
// 	ОбъектКомпоненты - ВнешняяКомпонентаОбъект - Объект компоненты работы с буфером обмена (Необязательный)
Процедура НачатьКопированиеКартинкиВБуфер(Картинка, ОписаниеОповещения, ОбъектКомпоненты = Неопределено) Экспорт
	Если ОбъектКомпоненты = Неопределено Тогда
		ДопПараметры=Новый Структура;
		ДопПараметры.Вставить("Картинка", Картинка);
		ДопПараметры.Вставить("ОписаниеОповещенияОЗавершении", ОписаниеОповещения);

		НачатьПолучениеКомпоненты(
			Новый ОписаниеОповещения("НачатьКопированиеКартинкиВБуферЗавершениеПолученияКомпоненты", ЭтотОбъект,
			ДопПараметры));
	Иначе
		ТекКартинка=КартинкаДляКопированияВБуфер(Картинка);
		Если ТекКартинка = Неопределено Тогда
			Возврат;
		КонецЕсли;
		
		ОписаниеОповещенияВызоваМетодаКомпоненты = Новый ОписаниеОповещения("НачатьКопированиеКартинкиВБуферЗавершениеВыполненияМетодаКомпоненты",
			ЭтотОбъект, Новый Структура("ОписаниеОповещения", ОписаниеОповещения));

		ОбъектКомпоненты.НачатьВызовЗаписатьКартинку(ОписаниеОповещенияВызоваМетодаКомпоненты, ТекКартинка);
	КонецЕсли;
КонецПроцедуры

// Начинает получение картинки из буфера обмена
// 
// Параметры:
// 	ОписаниеОповещения - ОписаниеОповещения - Содержит описание процедуры, которая будет вызвана после завершения со следующими параметрами:
//	<ДанныеКартинки> – Данные картинки в запрошенном формате, Тип: Строка, ДвоичныеДанные, Картинка. Неопределено- если не удалось подключить компоненту или в буфере нет картинки
//	<ДополнительныеПараметры> - значение, которое было указано при создании объекта ОписаниеОповещения.
// 	ВариантПолучения - Строка
// 	Один из варинатов:
// 		ДвоичныеДанные- получение двоичных данных картинки
// 		Картинка- Преобразованное к типу "Картинка" содержание буфера
// 		Адрес- Адрес двоичных данных картинки во временном хранилище
// 	ОбъектКомпоненты - ВнешняяКомпонентаОбъект - Объект компоненты работы с буфером обмена (Необязательный)
Процедура НачатьПолучениеКартинкиИзБуфера(ОписаниеОповещения, ВариантПолучения = "Картинка",
	ОбъектКомпоненты = Неопределено) Экспорт
	ДопПараметры=Новый Структура;
	ДопПараметры.Вставить("ВариантПолучения", ВариантПолучения);
	ДопПараметры.Вставить("ОписаниеОповещенияОЗавершении", ОписаниеОповещения);

	Если ОбъектКомпоненты = Неопределено Тогда

		НачатьПолучениеКомпоненты(
			Новый ОписаниеОповещения("НачатьПолучениеКартинкиИзБуфераЗавершениеПолученияКомпоненты", ЭтотОбъект,
			ДопПараметры));
	Иначе
		ОбъектКомпоненты.НачатьПолучениеКартинка(Новый ОписаниеОповещения("НачатьПолучениеКартинкиИзБуфераЗавершение",
			ЭтотОбъект, ДопПараметры));
	КонецЕсли;
КонецПроцедуры

// Начинает помещение текста в буфер обмена
// 
// Параметры:
// 	СтрокаКопирования- Строка- Строка, которую необходимо поместить в буфер обмена
// 	ОписаниеОповещения - ОписаниеОповещения - Содержит описание процедуры, которая будет вызвана после завершения со следующими параметрами:
//	<Результат> – Результат установки текста в буфере обмена, Тип: Булево. Неопределено- если не удалось подключить компоненту
//	<ПараметрыВызова> - Массив параметров вызова метода компоненты
//	<ДополнительныеПараметры> - значение, которое было указано при создании объекта ОписаниеОповещения.
// 	ОбъектКомпоненты - ВнешняяКомпонентаОбъект - Объект компоненты работы с буфером обмена (Необязательный)
Процедура НачатьКопированиеСтрокиВБуфер(СтрокаКопирования, ОписаниеОповещения, ОбъектКомпоненты = Неопределено) Экспорт
	Если ОбъектКомпоненты = Неопределено Тогда
		ДопПараметры=Новый Структура;
		ДопПараметры.Вставить("СтрокаКопирования", СтрокаКопирования);
		ДопПараметры.Вставить("ОписаниеОповещенияОЗавершении", ОписаниеОповещения);

		НачатьПолучениеКомпоненты(
			Новый ОписаниеОповещения("НачатьКопированиеСтрокиВБуферЗавершениеПолученияКомпоненты", ЭтотОбъект,
			ДопПараметры));
	Иначе
		ДопПараметры=Новый Структура;
		ДопПараметры.Вставить("ОписаниеОповещенияОЗавершении", ОписаниеОповещения);

		ОбъектКомпоненты.НачатьВызовЗаписатьТекст(
			Новый ОписаниеОповещения("НачатьКопированиеСтрокиВБуферЗавершениеВызоваМетодаКомпоненты", ЭтотОбъект,
			ДопПараметры), СтрокаКопирования);
	КонецЕсли;
КонецПроцедуры


// Начинает получение текста из буфера обмена
// 
// Параметры:
// 	ОписаниеОповещения - ОписаниеОповещения - Содержит описание процедуры, которая будет вызвана после завершения со следующими параметрами:
//	<Результат> – Текст из буфера обмена, Тип: Строка. Неопределено- если не удалось подключить компоненту
//	<ДополнительныеПараметры> - значение, которое было указано при создании объекта ОписаниеОповещения.
// 	ОбъектКомпоненты - ВнешняяКомпонентаОбъект - Объект компоненты работы с буфером обмена (Необязательный)
Процедура НачатьПолучениеСтрокиИзБуфера(ОписаниеОповещения, ОбъектКомпоненты = Неопределено) Экспорт
	ДопПараметры=Новый Структура;
	ДопПараметры.Вставить("ОписаниеОповещенияОЗавершении", ОписаниеОповещения);
	Если ОбъектКомпоненты = Неопределено Тогда

		НачатьПолучениеКомпоненты(
			Новый ОписаниеОповещения("НачатьПолучениеСтрокиИзБуфераЗавершениеПолученияКомпоненты", ЭтотОбъект,
			ДопПараметры));
	Иначе
		ОбъектКомпоненты.НачатьПолучениеТекст(
			Новый ОписаниеОповещения("НачатьПолучениеСтрокиИзБуфераЗавершениеВызоваМетодаКомпоненты", ЭтотОбъект,
			ДопПараметры));
	КонецЕсли;
КонецПроцедуры


// Начинает получение формата текущего значения в буфере обмена
// 
// Параметры:
// 	ОписаниеОповещения - ОписаниеОповещения - Содержит описание процедуры, которая будет вызвана после завершения со следующими параметрами:
//	<Результат> – Строка в формате JSON, содержащая описание формата содержимого буфера обмена, Тип: Строка. Неопределено- если не удалось подключить компоненту
//	<ДополнительныеПараметры> - значение, которое было указано при создании объекта ОписаниеОповещения.
// 	ОбъектКомпоненты - ВнешняяКомпонентаОбъект - Объект компоненты работы с буфером обмена (Необязательный)
Процедура НачатьПолучениеФорматаБуфераОбмена(ОписаниеОповещения, ОбъектКомпоненты = Неопределено) Экспорт
	ДопПараметры=Новый Структура;
	ДопПараметры.Вставить("ОписаниеОповещенияОЗавершении", ОписаниеОповещения);
	Если ОбъектКомпоненты = Неопределено Тогда
		НачатьПолучениеКомпоненты(
			Новый ОписаниеОповещения("НачатьПолучениеФорматаБуфераОбменаЗавершениеПолученияКомпоненты", ЭтотОбъект,
			ДопПараметры));
	Иначе
		ОбъектКомпоненты.НачатьПолучениеФормат(
			Новый ОписаниеОповещения("НачатьПолучениеФорматаБуфераОбменаЗавершениеВызоваМетодаКомпоненты", ЭтотОбъект,
			ДопПараметры));
	КонецЕсли;
КонецПроцедуры

#КонецОбласти

#КонецОбласти

#Область СлужебныйПрограммныйИнтерфейс

Процедура НачатьИнициализациюКомпоненты(ОписаниеОповещения, ПопытатьсяУстановитьКомпоненту = Истина) Экспорт

	ДополнительныеПараметрыОповещения=Новый Структура;
	ДополнительныеПараметрыОповещения.Вставить("ОповещениеОЗавершении", ОписаниеОповещения);
	ДополнительныеПараметрыОповещения.Вставить("ПопытатьсяУстановитьКомпоненту", ПопытатьсяУстановитьКомпоненту);

	НачатьПодключениеВнешнейКомпоненты(
		Новый ОписаниеОповещения("НачатьПолучениеКомпонентыЗавершениеПодключенияКомпоненты", ЭтотОбъект,
		ДополнительныеПараметрыОповещения), ИмяМакетаКомпоненты(), ИдентификаторКомпоненты(),
		ТипВнешнейКомпоненты.Native);

КонецПроцедуры

Процедура НачатьПолучениеКомпонентыЗавершениеПодключенияКомпоненты(Подключено, ДополнительныеПараметры) Экспорт
	Если Подключено Тогда
		ОповещениеОЗавершении=ДополнительныеПараметры.ОповещениеОЗавершении;
		ВыполнитьОбработкуОповещения(ОповещениеОЗавершении, ОбъектКомпоненты());
	ИначеЕсли ДополнительныеПараметры.ПопытатьсяУстановитьКомпоненту Тогда
		НачатьУстановкуВнешнейКомпоненты(
			Новый ОписаниеОповещения("НачатьПолучениеКомпонентыЗавершениеУстановкиКомпоненты", ЭтотОбъект,
			ДополнительныеПараметры), ИмяМакетаКомпоненты());
	Иначе
		ОповещениеОЗавершении=ДополнительныеПараметры.ОповещениеОЗавершении;
		ВыполнитьОбработкуОповещения(ОповещениеОЗавершении, Неопределено);
	КонецЕсли;
КонецПроцедуры

Процедура НачатьПолучениеКомпонентыЗавершениеУстановкиКомпоненты(ДополнительныеПараметры) Экспорт
	НачатьИнициализациюКомпоненты(ДополнительныеПараметры.ОповещениеОЗавершении, Ложь);
КонецПроцедуры

Процедура НачатьПолучениеВерсииКомпонентыЗавершениеПолученияКомпоненты(Результат, ДополнительныеПараметры) Экспорт
	Если Результат = Неопределено Тогда
		ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОписаниеОповещенияОЗавершении, Неопределено);
	Иначе
		НачатьПолучениеВерсииКомпоненты(ДополнительныеПараметры.ОписаниеОповещенияОЗавершении, Результат);
	КонецЕсли;
КонецПроцедуры

Процедура НачатьОчисткуБуфераОбменаЗавершениеПолученияКомпоненты(Результат, ДополнительныеПараметры) Экспорт
	Если Результат = Неопределено Тогда
		ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОписаниеОповещенияОЗавершении, Неопределено);
	Иначе
		НачатьОчисткуБуфераОбмена(ДополнительныеПараметры.ОписаниеОповещенияОЗавершении, Результат);
	КонецЕсли;
КонецПроцедуры

Процедура НачатьОчисткуБуфераОбменаЗавершениеВызоваМетодаКомпонента(Результат, ПараметрыВызова, ДополнительныеПараметры) Экспорт
	ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОписаниеОповещенияОЗавершении, Результат);
КонецПроцедуры


Процедура НачатьКопированиеКартинкиВБуферЗавершениеПолученияКомпоненты(Результат, ДополнительныеПараметры) Экспорт
	Если Результат = Неопределено Тогда
		ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОписаниеОповещенияОЗавершении, Неопределено);
	Иначе
		НачатьКопированиеКартинкиВБуфер(ДополнительныеПараметры.Картинка,
			ДополнительныеПараметры.ОписаниеОповещенияОЗавершении, Результат);
	КонецЕсли;
КонецПроцедуры

Процедура НачатьКопированиеКартинкиВБуферЗавершениеВыполненияМетодаКомпоненты(Результат, ПараметрыВызова,
	ДополнительныеПараметры) Экспорт
	ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОписаниеОповещения, Результат);
КонецПроцедуры

Процедура НачатьПолучениеКартинкиИзБуфераЗавершениеПолученияКомпоненты(Результат, ДополнительныеПараметры) Экспорт
	Если Результат = Неопределено Тогда
		ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОписаниеОповещенияОЗавершении, Неопределено);
	Иначе
		НачатьПолучениеКартинкиИзБуфера(ДополнительныеПараметры.ОписаниеОповещенияОЗавершении,
			ДополнительныеПараметры.ВариантПолучения, Результат);
	КонецЕсли;
КонецПроцедуры

Процедура НачатьПолучениеКартинкиИзБуфераЗавершение(Результат, ДополнительныеПараметры) Экспорт
	ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОписаниеОповещенияОЗавершении, КартинкаВНужномФорматеИзБуфера(
		Результат, ДополнительныеПараметры.ВариантПолучения));
КонецПроцедуры

Процедура НачатьКопированиеСтрокиВБуферЗавершениеПолученияКомпоненты(Результат, ДополнительныеПараметры) Экспорт
	Если Результат = Неопределено Тогда
		ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОписаниеОповещенияОЗавершении, Неопределено);
	Иначе
		НачатьКопированиеСтрокиВБуфер(ДополнительныеПараметры.СтрокаКопирования,
			ДополнительныеПараметры.ОписаниеОповещенияОЗавершении, Результат);
	КонецЕсли;
КонецПроцедуры


Процедура НачатьКопированиеСтрокиВБуферЗавершениеВызоваМетодаКомпоненты(Результат,ПараметрыВызова, ДополнительныеПараметры) Экспорт
	ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОписаниеОповещенияОЗавершении, Результат);
КонецПроцедуры

Процедура НачатьПолучениеСтрокиИзБуфераЗавершениеПолученияКомпоненты(Результат, ДополнительныеПараметры) Экспорт
	Если Результат = Неопределено Тогда
		ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОписаниеОповещенияОЗавершении, Неопределено);
	Иначе
		НачатьПолучениеСтрокиИзБуфера(ДополнительныеПараметры.ОписаниеОповещенияОЗавершении, Результат);
	КонецЕсли;
КонецПроцедуры

Процедура НачатьПолучениеСтрокиИзБуфераЗавершениеВызоваМетодаКомпоненты(Результат, ДополнительныеПараметры) Экспорт
	ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОписаниеОповещенияОЗавершении, Результат);
КонецПроцедуры

Процедура НачатьПолучениеФорматаБуфераОбменаЗавершениеПолученияКомпоненты(Результат, ДополнительныеПараметры) Экспорт
	Если Результат = Неопределено Тогда
		ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОписаниеОповещенияОЗавершении, Неопределено);
	Иначе
		НачатьПолучениеФорматаБуфераОбмена(ДополнительныеПараметры.ОписаниеОповещенияОЗавершении, Результат);
	КонецЕсли;
КонецПроцедуры

Процедура НачатьПолучениеФорматаБуфераОбменаЗавершениеВызоваМетодаКомпоненты(Результат, ДополнительныеПараметры) Экспорт
	ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОписаниеОповещенияОЗавершении, Результат);
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

// Текущая версия платформы1 с предприятие.
// 
// Возвращаемое значение:
//  Строка -  Текущая версия платформы 1С предприятие
Функция ТекущаяВерсияПлатформы1СПредприятие()

	СистИнфо = Новый СистемнаяИнформация;
	Возврат СистИнфо.ВерсияПриложения;

КонецФункции

// Версия платформы не младше.
// 
// Параметры:
//  ВерсияДляСравнения - Строка -  Версия для сравнения
// 
// Возвращаемое значение:
//  Булево -  Версия платформы не младше
Функция ВерсияПлатформыНеМладше(ВерсияДляСравнения) 
	ВерсияБезСборки=ВерсияКонфигурацииБезНомераСборки(ТекущаяВерсияПлатформы1СПредприятие());

	Возврат СравнитьВерсииБезНомераСборки(ВерсияБезСборки, ВерсияДляСравнения)>=0;
КонецФункции

// Получает номер версии конфигурации без номера сборки.
//
// Параметры:
//  Версия - Строка - версия конфигурации в формате РР.ПП.ЗЗ.СС,
//                    где СС - номер сборки, который будет удален.
// 
// Возвращаемое значение:
//  Строка - номер версии конфигурации без номера сборки в формате РР.ПП.ЗЗ.
//
Функция ВерсияКонфигурацииБезНомераСборки(Знач Версия) 

	Массив = СтрРазделить(Версия, ".");

	Если Массив.Количество() < 3 Тогда
		Возврат Версия;
	КонецЕсли;

	Результат = "[Редакция].[Подредакция].[Релиз]";
	Результат = СтрЗаменить(Результат, "[Редакция]", Массив[0]);
	Результат = СтрЗаменить(Результат, "[Подредакция]", Массив[1]);
	Результат = СтрЗаменить(Результат, "[Релиз]", Массив[2]);

	Возврат Результат;
КонецФункции

// Сравнить две строки версий.
//
// Параметры:
//  СтрокаВерсии1  - Строка - номер версии в формате РР.{П|ПП}.ЗЗ.
//  СтрокаВерсии2  - Строка - второй сравниваемый номер версии.
//
// Возвращаемое значение:
//   Число   - больше 0, если СтрокаВерсии1 > СтрокаВерсии2; 0, если версии равны.
//
Функция СравнитьВерсииБезНомераСборки(Знач СтрокаВерсии1, Знач СтрокаВерсии2) 

	Строка1 = ?(ПустаяСтрока(СтрокаВерсии1), "0.0.0", СтрокаВерсии1);
	Строка2 = ?(ПустаяСтрока(СтрокаВерсии2), "0.0.0", СтрокаВерсии2);
	Версия1 = СтрРазделить(Строка1, ".");
	Если Версия1.Количество() <> 3 Тогда
		ВызватьИсключение СтрШаблон(НСтр("ru = 'Неправильный формат параметра СтрокаВерсии1: %1'"), СтрокаВерсии1);
	КонецЕсли;
	Версия2 = СтрРазделить(Строка2, ".");
	Если Версия2.Количество() <> 3 Тогда
		ВызватьИсключение СтрШаблон(НСтр("ru = 'Неправильный формат параметра СтрокаВерсии2: %1'"), СтрокаВерсии2);
	КонецЕсли;

	Результат = 0;
	Для Разряд = 0 По 2 Цикл
		Результат = Число(Версия1[Разряд]) - Число(Версия2[Разряд]);
		Если Результат <> 0 Тогда
			Возврат Результат;
		КонецЕсли;
	КонецЦикла;
	Возврат Результат;

КонецФункции

Функция ИмяМакетаКомпоненты()
	Возврат "ОбщийМакет.БуферО_КомпонентаДляРаботыСБуферомОбмена";
КонецФункции

Функция КартинкаДляКопированияВБуфер(Картинка)
	Если ТипЗнч(Картинка) = Тип("Строка") И ЭтоАдресВременногоХранилища(Картинка) Тогда

		ТекКартинка=ПолучитьИзВременногоХранилища(Картинка);
	Иначе
		ТекКартинка=Картинка;
	КонецЕсли;

	Если ТипЗнч(ТекКартинка) = Тип("Картинка") Тогда
		ДвоичныеДанные = ТекКартинка.ПолучитьДвоичныеДанные();
	ИначеЕсли ТипЗнч(ТекКартинка) = Тип("ДвоичныеДанные") Тогда
		ДвоичныеДанные=ТекКартинка;
	Иначе
		Сообщить("Неверный тип картинки");
		ДвоичныеДанные=Неопределено;
	КонецЕсли;

	Возврат ДвоичныеДанные;
КонецФункции

Функция КартинкаВНужномФорматеИзБуфера(ДанныеБуфера, ВариантПолучения) 
	Если ТипЗнч(ДанныеБуфера) <> Тип("ДвоичныеДанные") Тогда
		Возврат Неопределено;
	КонецЕсли;

	Если НРег(ВариантПолучения) = "двоичныеданные" Тогда
		Возврат ДанныеБуфера;
	ИначеЕсли НРег(ВариантПолучения) = "адрес" Тогда
		Возврат ПоместитьВоВременноеХранилище(ДанныеБуфера);
	Иначе
		Возврат Новый Картинка(ДанныеБуфера);
	КонецЕсли;
КонецФункции

Функция ИдентификаторКомпоненты()
	Возврат "clipboard1c";
КонецФункции

Функция ОбъектКомпонентыРаботыСБуферомОбмена(ОбъектКомпоненты = Неопределено)
	Если ОбъектКомпоненты = Неопределено Тогда
		Возврат КомпонентаРаботыСБуферомОбмена();
	Иначе
		Возврат ОбъектКомпоненты;
	КонецЕсли;
КонецФункции

Функция ПроинициализироватьКомпоненту(ПопытатьсяУстановитьКомпоненту = Истина)

	ИмяМакетаКомпоненты=ИмяМакетаКомпоненты();
	КодВозврата = ПодключитьВнешнююКомпоненту(ИмяМакетаКомпоненты, ИдентификаторКомпоненты(),
		ТипВнешнейКомпоненты.Native);

	Если Не КодВозврата Тогда

		Если Не ПопытатьсяУстановитьКомпоненту Тогда
			Возврат Ложь;
		КонецЕсли;

		УстановитьВнешнююКомпоненту(ИмяМакетаКомпоненты);

		Возврат ПроинициализироватьКомпоненту(Ложь); // Рекурсивно.

	КонецЕсли;

	Возврат ОбъектКомпоненты();
КонецФункции
#КонецОбласти